<?php
class Delivery_Model_Mapper_Pedidos
	extends Delivery_Model_Mapper_Abstract
{
	
	public function getDbTable()
	{
		return parent::getDbTable( 'Pedidos' );
	}
	
	public function save( $pedido )
	{
		$dbTable= $this->getDbTAble();
		
		if ( ! $pedido->getId() ){
			return $pedido->idPedido = $dbTable->guardar( $pedido );		
		} else {
			return $dbTable->actualizar( $pedido );	
		}			
	}
	
	/**
	 * @param int $idPedido
	 * @return object Delivery_Model_Pedido
	 */
	public function getById( $idPedido, $idNegocio = null, $idCliente = null ){
	
		if ( $this->getIdentityMap()->isRegistered( 'Delivery_Model_Pedido', $idPedido )){
			return $this->getIdentityMap()->get( 'Delivery_Model_Pedido', $idPedido );
		}
		
		$dbTable= $this->getDbTAble();
		$row	= $dbTable->getById( $idPedido, $idNegocio, $idCliente );
	
		if( empty($row) ){
			throw new Delivery_Model_Exception( Delivery_Model_Exception::ORDER_NOT_FOUND );
		}
		
		return $this->_fetch( $row );
	}
	
	public function getByIds( $ids )
	{
	
		$dbTable= $this->getDbTAble();
	
		return $this->_fetchCollection(
			'Pedidos',
			$dbTable->getByIds( $ids )
		);
	}
	
	/**
	 * @param $idNegocio
	 * @return Delivery_Model_Collection_Pedidos
	 */
	public function getByNegocio( $idNegocio )
	{
	
		$dbTable= $this->getDbTAble();
	
		return $this->_fetchCollection(
			'Pedidos',
			$dbTable->getByNegocio( $idNegocio )
		);
	}
	
	/**
	 * @param $idCliente
	 * @return Delivery_Model_Collection_Pedidos
	 */
	public function getByCliente( $idCliente, $idNegocio=null)
	{
	
		$dbTable= $this->getDbTAble();
	
		return $this->_fetchCollection(
			'Pedidos',
			$dbTable->getByCliente( $idCliente, $idNegocio )
		);
	}
	
	public function toBeClosed( )
	{
		$dbTable= $this->getDbTAble();
	
		return $this->_fetchCollection(
			'Pedidos',
			$dbTable->toBeClosed( Delivery_Model_Pedido::CLOSETIME )
		);
	}
	
	public function openOrders( $idNegocio )
	{
		$dbTable= $this->getDbTAble();
	
		return $this->_fetchCollection(
			'Pedidos',
			$dbTable->openOrders( $idNegocio )
		);
	}
	
	public function getByParams( $params, $offset = null, $limit = null, $order = null )
	{
		$dbTable= $this->getDbTAble();
	
		return $this->_fetchCollection(
			'Pedidos',
			$dbTable->getByParams($params, $offset, $limit, $order)
		);
	}
	
	public function countByParams( $params )
	{
		return $this->getDbTAble()->countByParams($params);
	}
	
	public function inAnyOrder( $object )
	{
		$dbTable= $this->getDbTAble();

		if ( $object instanceof Delivery_Model_ClienteDireccion ){
			
			$result = $dbTable->inAnyOrder( 'idDireccionCliente', $object->getId() );
		} 
		elseif ( $object instanceof Delivery_Model_Negocio ){
			$result = $dbTable->inAnyOrder( 'idNegocio', $object->getId() );
		} 
		elseif ( $object instanceof Delivery_Model_Cliente ){
			$result = $dbTable->inAnyOrder( 'idCliente', $object->getId() );
		} else {
			$result = false;
		}
		
		return $result;
	}
	
	public function loadNegocio( $pedidos )
	{
		$mapper = Delivery_Model_Factory::mapper('Negocios');
		
		Delivery_Model_DbTable_Desactivable::onlyActive( false );
		
		if ( $pedidos instanceof Delivery_Model_Collection_Pedidos && count($pedidos)){
		
			$negocios = $mapper->getByIds( $pedidos->getKeyValues( 'idNegocio', true ) );
			
			$pedidos->setNegocio( $negocios );
			
//			foreach ( $pedidos as $pedido){
//				$pedido->setNegocio(
//					$negocios->offsetGet( $pedido->idNegocio )
//				);
//			}
			
		}
		
	 	elseif ( $pedidos instanceof Delivery_Model_Pedido){
			
	 		$pedidos->setNegocio(
	 			$mapper->getById( $pedidos->idNegocio )
	 		);
		}
		
		Delivery_Model_DbTable_Desactivable::onlyActive();
	}
	
	public function loadCliente( $pedidos )
	{
		$mapper = Delivery_Model_Factory::mapper('Clientes');
		
		Delivery_Model_DbTable_Desactivable::onlyActive( false );
		
		if ( $pedidos instanceof Delivery_Model_Collection_Pedidos && count($pedidos)){
		
			$clientes = $mapper->getByIds( $pedidos->getKeyValues( 'idCliente', true ) );
			
			foreach ( $pedidos as $pedido){
				$pedido->setCliente(
					$clientes->offsetGet( $pedido->idCliente )
				);
			}
			
		}
		
	 	elseif ( $pedidos instanceof Delivery_Model_Pedido){
			
	 		$pedidos->setCliente(
	 			$mapper->getById( $pedidos->idCliente )
	 		);
		}
		
		Delivery_Model_DbTable_Desactivable::onlyActive();
	}
	
	public function loadDireccion( $pedidos )
	{
		$mapper = Delivery_Model_Factory::mapper('DireccionesCliente');
		
		Delivery_Model_DbTable_Desactivable::onlyActive( false );
		
		if ( $pedidos instanceof Delivery_Model_Collection_Pedidos && count($pedidos)){
		
			$idDirecciones = $pedidos->getKeyValues( 'idDireccionCliente', true );
			
			if ( empty( $idDirecciones ) ){
				return;
			}
			
			$direcciones = $mapper->getByIds( $idDirecciones );
			
			foreach ( $pedidos as $pedido){
				
				if ( $pedido->isPickup()){
					continue;
				}
				
				$pedido->setDireccion(
					$direcciones->offsetGet( $pedido->idDireccionCliente )
				);
			}
			
		}
		
	 	elseif ( $pedidos instanceof Delivery_Model_Pedido){
			
		 	if ( $pedidos->isPickup()){
				return;
			}
	 		
	 		$pedidos->setDireccion(
	 			$mapper->getById( $pedidos->idDireccionCliente )
	 		);
		}
		
		Delivery_Model_DbTable_Desactivable::onlyActive();
	}
	
	public function loadProductos( $pedidos )
	{
		$mapper = Delivery_Model_Factory::mapper('ProductosPedido');
		
		Delivery_Model_DbTable_Desactivable::onlyActive( false );
		
		if ( $pedidos instanceof Delivery_Model_Collection_Pedidos && count($pedidos)){
		
			$productos = $mapper->getByPedidos( $pedidos->getIds() );
			$mapper->loadOpciones( $productos );
			
			foreach ( $pedidos as $pedido){
				
				$pedido->setProductos(
					$productos->getByKey( 'idPedido', $pedido->getId() )
				);
			}
		}
		
	 	elseif ( $pedidos instanceof Delivery_Model_Pedido){
			
	 	    $productos = $mapper->getByPedido( $pedidos->getId() );
	 	    $mapper->loadOpcionesPedidas( $productos );
	 	    
	 		$pedidos->setProductos(
	 			$productos
	 		);
		}
		
		Delivery_Model_DbTable_Desactivable::onlyActive();
	}
	
	public function loadPromociones( $pedidos )
	{
		$mapper = Delivery_Model_Factory::mapper('PromocionesPedido');
		
		Delivery_Model_DbTable_Desactivable::onlyActive( false );
		
		if ( $pedidos instanceof Delivery_Model_Collection_Pedidos && count($pedidos)){
		
			$promociones = $mapper->getByPedido( $pedidos->getIds() );
			$mapper->loadProductosPedidos( $promociones );
			
			foreach ( $pedidos as $pedido){
				
				$pedido->setPromociones(
					$promociones->getByKey( 'idPedido', $pedido->getId() )
				);
			}
		}
		
	 	elseif ( $pedidos instanceof Delivery_Model_Pedido){
			
	 		$promociones = $mapper->getByPedido( $pedidos->getId() );
	 		$mapper->loadProductosPedidos( $promociones );
	 		
	 		$pedidos->setPromociones($promociones);
		}
		
		Delivery_Model_DbTable_Desactivable::onlyActive();
	}
	
    public function loadVoto( $pedidos )
	{
		$mapper = Delivery_Model_Factory::mapper('Votos');
		
		if ( $pedidos instanceof Delivery_Model_Collection_Pedidos && count($pedidos)){
		
			$votos = $mapper->getByPedidos( $pedidos->getIds() );
			
			foreach ( $votos as $voto){
			    $pedidos->offsetGet( $voto->idPedido )->setVoto( $voto );
			}
		}
	 	elseif ( $pedidos instanceof Delivery_Model_Pedido){
	 		$pedidos->setVoto(
	 			$mapper->getByPedido( $pedidos->getId() )
	 		);
		}
	}
	
	
	
	/**
	 * @param array
	 * @return object Delivery_Model_Pedido
	 */
	protected function _fetch( $row )
	{
		$pedido = new Delivery_Model_Pedido( $row );
		
		$this->getIdentityMap()->set( $pedido, $pedido->getId() );
		
		return $pedido;
	}
	
	
}